(* 基本类型 *)
type ty = Int | Void

(* 二元运算符 *)
type binop = 
  | Add     (* + *)
  | Sub     (* - *)
  | Mul     (* * *)
  | Div     (* / *)
  | Mod     (* % *)
  | Lt      (* < *)
  | Gt      (* > *)
  | Leq     (* <= *)
  | Geq     (* >= *)
  | Eq      (* == *)
  | Neq     (* != *)
  | And     (* && *)
  | Or      (* || *)

(* 一元运算符 *)
type unop = 
  | Plus    (* + *)
  | Minus   (* - *)
  | Not     (* ! *)

(* 表达式 *)
type expr =
  | Number of int              (* 整数常量 *)
  | Var of string              (* 变量引用 *)
  | Binop of binop * expr * expr (* 二元运算 *)
  | Unop of unop * expr        (* 一元运算 *)
  | Call of string * expr list (* 函数调用 *)
  | Assign of string * expr    (* 赋值表达式 *)

(* 语句 *)
type stmt =
  | Block of stmt list         (* 语句块 { ... } *)
  | ExprStmt of expr           (* 表达式语句 *)
  | VarDecl of string * expr option (* 变量声明，可选初始化 *)
  | AssignStmt of string * expr (* 赋值语句 *)
  | If of expr * stmt * stmt option (* if语句，else可选 *)
  | While of expr * stmt       (* while循环 *)
  | Break                      (* break语句 *)
  | Continue                   (* continue语句 *)
  | Return of expr option      (* return语句，可选返回值 *)
  | Empty                     (* 空语句 ; *)

(* 函数形参 *)
type param = Param of ty * string

(* 函数定义 *)
type func_def = {
  return_ty: ty;              (* 返回类型 *)
  name: string;               (* 函数名 *)
  params: param list;         (* 参数列表 *)
  body: stmt;                 (* 函数体 *)
}

(* 程序结构 *)
type program = func_def list   (* 编译单元：函数定义列表 *)